iT邦幫忙

2022 iThome 鐵人賽

DAY 6
0

今天來接續昨天說的 三元運算符。這應該算是如果你沒寫程式應該比較少看到的一個東西。

三元運算符(Ternary Conditional Operator)

三元運算符的特殊在於它是有三個操作數的運算符,它的形式是
問題 ? 答案 1 : 答案 2。
它簡潔地表達根據 問題成立與否作出二選一的操作。如果 問題 成立,返回 答案 1 的結果;反之返回 答案 2 的結果。

三元運算符等於以下代碼的縮寫

if question {
    answer1
}else{
    answer2
}

簡單來說他就是讓你的 if func 可以寫簡短一點讓他能一行解決,讓你得程式碼比較乾淨,不會一直在 if else 的 func 裡面,前提是你要的結果剛好就兩個

再來這里有個計算表格行高的例子。如果有表頭,那行高應比內容高度要高出 50 點;如果沒有表頭,只需高出 20 點:

let contentHeight = 40
let hasHeader = true
let rowHeight = contentHeight + (hasHeader ? 50 : 20)
// rowHeight 現在是 90

下面為沒使用 三元運算符 的代碼

let contentHeight = 40
let hasHeader = true
var rowHeight = contentHeight
if hasHeader {
    rowHeight = rowHeight + 50
} else {
    rowHeight = rowHeight + 20
}

空合運算符(Nil Coalescing Operator)

空合運算符(a ?? b)將對可選類型 a 進行空判斷,如果 a 包含一個值就進行解包,否則就返回一個默認值 b。表達式 a 必須是 Optional 類型。默認值 b 的類型必須要和 a 存儲值的類型保持一致。

我們先來解釋一下什麼事 Optional 類型,Optional的東西通常都會在Type型別後面有 ! 跟 ? 尾隨在後面。

var a: Int!
var a: Int?

那驚嘆號(!)跟問號(?)有什麼差別呢?
(!):驚嘆號的部分在程式上面叫做 強制解包 ,那什麼是強制解包呢?簡單來說就是你拿到一個箱子直接把它拆開,看裡面有什麼。

(?):那尾隨問號的是什麼意思呢?就是我有一個箱子,我不知道他裡面有沒有東西。聽起來就跟 薛丁格的貓 一樣。在你還沒打開前,你都不知道裡面有沒有東西。就是一個有跟沒有之間。

回到空合運算符,就跟上面的解釋一樣寫成程式碼就如下面。

if a != nil{
    a = a
}else{
    a = b
}

看完上面這個,有沒有覺得很眼熟,如果你用三元運算符寫的話,那就是

a != nil ? a! : b
// a ?? b 的代碼內容

那如果你知道空合運算符的話你就可以直接縮減成

a ?? b

區間運算符(Range Operators)

閉區間運算符

閉區間運算符(a...b)定義一個包含從 a 到 b(包括 a 和 b)的所有值的區間。a 的值不能超過 b。

閉區間運算符在迭代一個區間的所有值時是非常有用的,如在 for-in 循環中:

for index in 1...5 {
    print("\(index) * 5 = \(index * 5)")
}
// 1 * 5 = 5
// 2 * 5 = 10
// 3 * 5 = 15
// 4 * 5 = 20
// 5 * 5 = 25

半開區間運算符

半開區間運算符(a..<b)定義一個從 a 到 b 但不包括 b 的區間。 之所以稱為半開區間,是因為該區間包含第一個值而不包括最後的值。

半開區間的實用性在於當你使用一個從 0 開始的列表(如數組)時,非常方便地從0數到列表的長度

let names = ["Anna", "Alex", "Brian", "Jack"]
let count = names.count
for i in 0..<count {
    print("第 \(i + 1) 個人叫 \(names[i])")
}
// 第 1 個人叫 Anna
// 第 2 個人叫 Alex
// 第 3 個人叫 Brian
// 第 4 個人叫 Jack

因為 Array 性質 第一筆資料順序默認為 0 1 2 3 所以 i 才需要 +1
如果不知道 Array 是什麼東西,沒有關係我們後面會講到。

單邊區間

這邊我們延續上面的 Code 來繼續看這個單邊區間。

閉區間操作符有另一個表達形式,可以表達往一側無限延伸的區間 —— 例如,一個包含了數組從索引 2 到結尾的所有值的區間。在這些情況下,你可以省略掉區間操作符一側的值。這種區間叫做單側區間,因為操作符只有一側有值。例如:

for name in names[2...] {
    print(name)
}
// Brian
// Jack

for name in names[...2] {
    print(name)
}
// Anna
// Alex
// Brian

半開區間操作符也有單側表達形式,附帶上它的最終值。就像你使用區間去包含一個值,最終值並不會落在區間內。例如:

for name in names[..<2] {
    print(name)
}
// Anna
// Alex

邏輯運算符(Logical Operators)

邏輯運算符的操作對象是邏輯布爾值。Swift 支持基於 C 語言的三個標準邏輯運算。

  • 邏輯非(!a)
  • 邏輯與(a && b)
  • 邏輯或(a || b)

邏輯非運算符

邏輯非運算符(!a)對一個 Bool 值取反,使得 true 變 false,false 變 true。
它是一個前置運算符,需緊跟在操作數之前,且不加空格。讀作 非 a 。

邏輯與運算符

邏輯與運算符(a && b)表達了只有 a 和 b 的值都為 true 時,整個表達式的值才會是 true。
簡單來說就是,我符合了 a 跟 b 的條件,我才可以繼續往下執行。

let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan {
    print("Welcome!")
} else {
    print("ACCESS DENIED")
}
// 输出“ACCESS DENIED”

邏輯或運算符

邏輯或運算符(a || b)是一個由兩個連續的 | 組成的中置運算符。它表示了兩個邏輯表達式的其中一個為 true,整個表達式就為 true。

簡單來說就是,我有 a 跟 b 兩個條件,其中一個符合就可以往下執行。

let hasDoorKey = false
let knowsOverridePassword = true
if hasDoorKey || knowsOverridePassword {
    print("Welcome!")
} else {
    print("ACCESS DENIED")
}
// 输出“Welcome!”

今天總算把運算符講完了,有夠長一大篇。
那我們來休息了,明天才能走更長遠的路。


上一篇
30天的 iOS 修仙道路 (5)
下一篇
30天的 iOS 修仙道路 (7) - 字串字符
系列文
30天的 iOS 修仙道路 站穩腳步基礎篇30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言